{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "638daffa",
   "metadata": {},
   "source": [
    "# An example on prototype selection\n",
    "In this notebook, we show an example of selecting prototypical examples from the source dataset which are representative of the target dataset. We experiment with the popular [digit dataset](https://scikit-learn.org/stable/auto_examples/datasets/plot_digits_last_image.html). Two partitions are randomly created, **src** and **tgt**, which correspond to the source and target sets, respectively. [Our approach](https://link.springer.com/chapter/10.1007/978-3-030-86514-6_33) exploits the optimal tranpot theory to learn prototypes from **src** by matching the prototype distribution with the target **tgt** distribution."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7712fae6",
   "metadata": {},
   "source": [
    "We load the required packages. The package/file specific to the prototype selection algorithm is \"SPOTgreedy\". "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "34efebf4",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.datasets import load_digits\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.metrics import pairwise_distances\n",
    "import numpy as np  \n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.metrics import pairwise_distances\n",
    "from interpret.utils import SPOT_GreedySubsetSelection # This loads the SPOT prototype selection algorithm."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ec400f24",
   "metadata": {},
   "source": [
    "We now load the digit dataset and create **src** and **tgt** sets by splitting the digit data into 70/30 partitions."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "bed6a55b",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Load the digits dataset\n",
    "digits = load_digits()\n",
    "\n",
    "# Flatten the images\n",
    "n_samples = len(digits.images)\n",
    "data = digits.images.reshape((n_samples, -1))\n",
    "\n",
    "# Split data into 70% src and 30% tgt subsets \n",
    "X_src, X_tgt, y_src, y_tgt = train_test_split(\n",
    "    data, digits.target, test_size=0.3, shuffle=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "31905373",
   "metadata": {},
   "source": [
    "Pairwise distances/dissimilarities between the source and target points are required. The optimal transport framework allows the use of any distance/dissimilarity measure. In this example, we use the Euclidean distance metric."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "051e20b1",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Compute the Euclidean distances between the X_src (source) and X_tgt (target) points.\n",
    "C = pairwise_distances(X_src, X_tgt, metric='euclidean');\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d6837b0a",
   "metadata": {},
   "source": [
    "`targetmarginal` is the empirical distribution over the target points. It is usually taken to be uniform, i.e., every target point is given equal importance. For the experiments, we discuss two settings. In the first setting, we take `targetmarginal` to be uniform. In the second setting, we skew `targetmarginal` against points of a particular class. The experiments show that in both of these settings, the learnt prototypes nicely represent the target distribution `targetmarginal`. "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b2699d84",
   "metadata": {},
   "source": [
    "**Setting 1: target distribution is uniform**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "43fa0e42",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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si/vkgpdlt4MNXTBUsoDy8vLVfNAre177733iIho5syZoimHXF2Pw7fffkvHjx+nyMhI+vjjj83yEEvrHTx4MA0ePJguX75MO3bsoG3bttH69evpww8/pOPHj9OePXvI09NTHNeIiAibmm06ktT8o7i4WFSNj42NFW9r09LS6P3336fTp087PXjhSNYevtWqfzc0Z5eHXc3Zs2epsLCQmjRpQps3b6bg4GCT+fXJK63lZVr5WEPf4+S/KdV2VlOXMqit+U1DsvfZqjGuW2vXITOL7WiI69ApfV5IhdhDhw6pzr9+/bq4ANUKvD/88INqlUZmFtWo1L5nSU1NDZ04cUJ1nlRV3951WtvO//3vf0R0O3Imf/trremDtfUajUY6cuSIWZptbVLh7e1NI0eOpOrqalq/fj1t2bKFzp8/T0lJSapthCX2HhepepEtb4fV6HQ6io+Pp2eeeYa++uorUdhauXKl3esyGAyUkZFBc+bMoYMHD1JqaipVVlbS+vXrHZZeuYCAAFHFWDoPbCHt/71791qs1itn7bjXdbukYymda0rSddPQ6nrdNQZH9f+g5MhzVSLVQtJ6I11RUSGqqirfTty8eZPOnz9v9k86hy9fvkznz583qZHEtzuMNvknNbUisn7+HT9+3CFv6uvLGcfCVlFRUTRu3Dhav349bdy4kYiI/vnPf1rNO9q3b09ubm5UVVWl2dZUuo7svS+qkY5rr169VK8JR/R1IbF23lRWVtr18Cvtq4sXL9K5c+dUl5GqVTeUuubN0nG45557VOdrHQdr+Zi03u7du6sGP205vsHBwZSZmUmLFy+mgwcPUkBAAO3bt4++++47IrpdLdnT05POnTtnd7OW+ubDPXr0IG9vb/ruu+/o22+/pcuXL5sEJ6TpoqKiOvV34az7hDXSw6zWw5NWmbkhSee61FxPjSPzKmezdqyl5hcdO3Y0C1wQ1S+vlPbPf//7X9X5WvlYXe9x9TmvpXz31q1bJuUCufqUQa3lN0QNd13+9NNPmue22vOptevWWu2YurBW7j527BhVV1eTu7u7ZhMRR3JK8GLgwIFERPThhx+qVuldsWIFVVVVUWRkJMXExJjNP336NH366admn2/atInKysrIx8eHUlNT7U7XsmXLzD4rLy8X1ZQHDBhg1/qk7dR6y7V48WKT5STe3t5EpF29asCAAaTT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\n",
      "text/plain": [
       "<Figure size 200x200 with 20 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Define a targetmarginal on the target set\n",
    "# We define the uniform marginal\n",
    "targetmarginal = np.ones(C.shape[1])/C.shape[1];\n",
    "\n",
    "\n",
    "# The number of prototypes to be computed\n",
    "numprototypes = 20;\n",
    "\n",
    "# Run SPOTgreedy\n",
    "# prototypeIndices represent the indices corresponding to the chosen prototypes.\n",
    "# prototypeWeights represent the weights associated with each of the chosen prototypes. The weights sum to 1. \n",
    "[prototypeIndices, prototypeWeights] = SPOT_GreedySubsetSelection(C, targetmarginal, numprototypes);\n",
    "\n",
    "# Plot the chosen prototypes\n",
    "fig, axs = plt.subplots(nrows=5, ncols=4, figsize=(2, 2))\n",
    "for idx, ax in enumerate(axs.ravel()):\n",
    "    ax.imshow(data[prototypeIndices[idx]].reshape((8, 8)), cmap=plt.cm.binary)\n",
    "    ax.axis(\"off\")\n",
    "_ = fig.suptitle(\"Top prototypes selected from the 64-dimensional digit dataset with uniform target distribution\", fontsize=16)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "457bca06",
   "metadata": {},
   "source": [
    "**Setting 2: target distribution is skewed**\n",
    "\n",
    "In this setting, we skew the examples in **tgt** corresponding to the label `3` by 90%. We expect that a large majority of the learnt prototypes also belong the label `3`. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "7e434c6b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 200x200 with 20 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Skew the target marginal to give weights to specific classes more\n",
    "result = np.where(y_tgt == 3); # find indices corresponding to label 3.\n",
    "\n",
    "\n",
    "targetmarginal_skewed = np.ones(C.shape[1]);\n",
    "targetmarginal_skewed[result[0]] = 90; # Weigh the instances corresponding to label 3 more.\n",
    "targetmarginal_skewed = targetmarginal_skewed/np.sum(targetmarginal_skewed);\n",
    "\n",
    "# Run SPOTgreedy\n",
    "[prototypeIndices_skewed, prototypeWeights_skewed] = SPOT_GreedySubsetSelection(C, targetmarginal_skewed, numprototypes);\n",
    "\n",
    "# Plot the prototypes selected\n",
    "fig, axs = plt.subplots(nrows=5, ncols=4, figsize=(2, 2))\n",
    "for idx, ax in enumerate(axs.ravel()):\n",
    "    ax.imshow(data[prototypeIndices_skewed[idx]].reshape((8, 8)), cmap=plt.cm.binary)\n",
    "    ax.axis(\"off\")\n",
    "_ = fig.suptitle(\"Top prototypes selected from the 64-dimensional digit dataset with skewed target distribution\", fontsize=16)\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "14e6471c",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.15"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
